import re
import csv
import os

def parse_markdown_to_csv(md_file_path, csv_output_path):
    """
    解析markdown文件并生成知识图谱CSV文件
    """
    
    # 读取markdown文件
    with open(md_file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 存储节点信息
    nodes = []
    
    # 解析markdown层级结构
    lines = content.split('\n')
    parent_stack = []  # 用于跟踪父节点层级
    
    for line in lines:
        line = line.strip()
        if not line:
            continue
            
        # 匹配标题（## 开头）
        title_match = re.match(r'^(#{1,6})\s+(.+)$', line)
        if title_match:
            level = len(title_match.group(1))
            title = title_match.group(2).strip()
            
            # 清理标题中的特殊字符
            title = re.sub(r'[<>，》]', '', title)
            
            # 调整父节点栈
            while len(parent_stack) >= level:
                parent_stack.pop()
            
            # 确定上级节点
            parent_node = parent_stack[-1] if parent_stack else ''
            
            # 添加节点
            nodes.append({
                '名称': title,
                '类型种类': '标签',
                '类型': '知识点',
                '上级节点': parent_node,
                '简介': title,
                '资源来源': '',
                '资源链接': '',
                '节点标签': '',
                '前序': '',
                '关联节点名称': ''
            })
            
            # 将当前节点加入父节点栈
            parent_stack.append(title)
            
        # 匹配列表项（- 开头）
        elif re.match(r'^-\s+(.+)$', line):
            item = re.match(r'^-\s+(.+)$', line).group(1).strip()
            
            # 清理特殊字符
            item = re.sub(r'[<>，》]', '', item)
            
            # 确定上级节点
            parent_node = parent_stack[-1] if parent_stack else ''
            
            # 添加叶子节点
            nodes.append({
                '名称': item,
                '类型种类': '标签',
                '类型': '知识点',
                '上级节点': parent_node,
                '简介': item,
                '资源来源': '',
                '资源链接': '',
                '节点标签': '',
                '前序': '',
                '关联节点名称': ''
            })
    
    # 写入CSV文件（使用UTF-8 BOM编码）
    with open(csv_output_path, 'w', newline='', encoding='utf-8-sig') as csvfile:
        fieldnames = ['名称', '类型种类', '类型', '上级节点', '简介', '资源来源', '资源链接', '节点标签', '前序', '关联节点名称']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        
        # 写入标题行
        writer.writeheader()
        
        # 写入数据行
        for node in nodes:
            writer.writerow(node)
    
    print(f"成功生成知识图谱CSV文件：{csv_output_path}")
    print(f"共生成 {len(nodes)} 个节点")

if __name__ == "__main__":
    md_file = r"c:\Users\thomas\Desktop\头哥\前端开发框架All.md"
    csv_file = r"c:\Users\thomas\Desktop\头哥\前端开发框架知识图谱_新版.csv"
    
    parse_markdown_to_csv(md_file, csv_file)